package com.sise.cn.task.service;

import com.sise.cn.task.enumerate.QueueEnum;
import com.sise.cn.task.enumerate.ServerResponseEnum;
import com.sise.cn.task.exception.TaskException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.support.CorrelationData;

import javax.annotation.Resource;

/**
 * @author 龚秀峰
 * @version 1.0
 * @date 2020/6/8 14:25
 */
@Slf4j
public abstract class AbstractTaskSender{

    @Resource
    private RabbitTemplate rabbitTemplate;

    /**
     * 发送延时任务
     *
     * @param obj        延时的对象，可以是ID等其他标识资源的属性
     * @param delayTimes 延迟时间（毫秒）
     */
    public void sendDelayTask(Object obj, final long delayTimes) {
        if (obj == null) {
            log.error("任务对象为空！");
            throw new TaskException(ServerResponseEnum.TASK_ERROR);
        }
        //发送延时任务
        rabbitTemplate.convertAndSend(QueueEnum.QUEUE_TASK_TTL.getExchange(), QueueEnum.QUEUE_TASK_TTL.getRouteKey(), obj, message -> {
            //设置任务延迟毫秒值
            message.getMessageProperties().setExpiration(String.valueOf(delayTimes));
            return message;
        });
        log.info("发送延时任务：{}", obj);
    }

    /**
     * 发送实时任务
     *
     * @param obj 延时的对象，可以是ID等其他标识资源的属性
     */
    public void sendTask(Object obj) {
        if (obj == null) {
            log.error("任务对象为空！");
            throw new TaskException(ServerResponseEnum.TASK_ERROR);
        }
        //发送实时任务
        rabbitTemplate.convertAndSend(QueueEnum.QUEUE_TASK.getExchange(), QueueEnum.QUEUE_TASK.getRouteKey(), obj, this::setMessageInfo);
        log.info("发送实时任务：{}", obj);
    }



    /**
     * 子类实现这个方法
     * 设置发送的消息属性
     *
     * @param message 发送的消息
     * @return 发送的消息
     */
    protected abstract Message setMessageInfo(Message message);

}
